package main

import "fmt"

// 抽象主题接口
type LightDevice interface {
	TurnOn() string
	TurnOff() string
	SetBrightness(level int) string
}

// ---------------------- 真实主题：物理灯泡 ----------------------
type PhysicalLight struct {
	IP string // 设备实际IP地址
}

func (l *PhysicalLight) TurnOn() string {
	// 伪代码：通过TCP协议发送控制指令
	return "物理灯泡已开启"
}

func (l *PhysicalLight) TurnOff() string {
	return "物理灯泡已关闭"
}

func (l *PhysicalLight) SetBrightness(level int) string {
	return fmt.Sprintf("亮度调整为%d%%", level)
}

// ---------------------- 代理：安全控制网关 ----------------------
type LightProxy struct {
	realDevice *PhysicalLight
	cache      map[string]string // 命令缓存
	userRole   string            // 用户权限
}

func NewLightProxy(ip string, role string) *LightProxy {
	return &LightProxy{
		realDevice: &PhysicalLight{IP: ip},
		cache:      make(map[string]string),
		userRole:   role,
	}
}

// 代理增强方法：权限校验
func (p *LightProxy) checkAccess() bool {
	return p.userRole == "admin" // 仅管理员有操作权限
}

// 代理增强方法：命令日志
func (p *LightProxy) logCommand(action string) {
	fmt.Printf("[审计日志] 用户%s执行操作：%s\n", p.userRole, action)
}

// 实现设备接口（代理核心）
func (p *LightProxy) TurnOn() string {
	if !p.checkAccess() {
		return "错误：权限不足"
	}

	p.logCommand("开灯")

	// 离线模式优先使用缓存
	if result, ok := p.cache["TurnOn"]; ok {
		return result + " (缓存)"
	}

	// 实际调用物理设备
	result := p.realDevice.TurnOn()
	p.cache["TurnOn"] = result
	return result
}

func (p *LightProxy) TurnOff() string {
	// 类似TurnOn的逻辑（省略重复校验部分）
	return p.realDevice.TurnOff()
}

func (p *LightProxy) SetBrightness(level int) string {
	// 类似TurnOn的逻辑（省略重复校验部分）
	return p.realDevice.SetBrightness(level)
}

// ---------------------- 客户端调用 ----------------------
func main() {
	// 普通用户尝试操作（被代理拦截）
	userProxy := NewLightProxy("192.168.1.100", "guest")
	fmt.Println(userProxy.TurnOn()) // 输出：错误：权限不足

	// 管理员操作（通过代理访问）
	adminProxy := NewLightProxy("192.168.1.100", "admin")
	fmt.Println(adminProxy.TurnOn()) // 首次真实调用
	fmt.Println(adminProxy.TurnOn()) // 第二次返回缓存结果
}
